/**
 * Description: 对bmp灰度位图进行直方图均衡化操作。
 * Function: int imgH(GARYSCALEBIT garyscalebit);       直方图均衡化
 * Solution: 如果你在使用本头文件时发现了任何问题，请报告issue.
 * Contributer: 刘臣帅，叶月枫
 */


#include "bmp.h"

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


#ifndef imgH_h
#define imgH_h
// 从bmp.h中获得GARYSCALEBIT

// 声明完成图像直方图均衡化的函数
int imgH(GARYSCALEBIT garyscalebit);
/*
 * Function: 对bmp灰度位图进行直方图均衡化
 * Parameter: garyscalebit [in]GARYSCALEBIT结构体，包括原图的灰度信息、数据个数和排列顺序
 * Return: 0 操作成功
 */

int imgH(GARYSCALEBIT garyscalebit)
{
    // 对于数据载入,对于一些数组的初始化
    int dataCount = garyscalebit.dataCount; // 总的数据量
    int histogram[256] = {0};               // 直方图
    int cdf[256] = {0};                     // 累积分布函数
    int newPixel[256];                      // 新的灰度值
    float scale = 255.0f / (dataCount);     // 进行 归一化
    // 计算所给图像的直方图
    for (int i = 0; i < dataCount; i++)
    {
        histogram[garyscalebit.garyscale[i]]++;
    }
    // 计算累积分布函数(CDF)
    cdf[0] = histogram[0];
    for (int i = 1; i < 256; i++)
    {
        cdf[i] = cdf[i - 1] + histogram[i];
    }
    // 计算图像新的像素值
    for (int i = 0; i < 256; i++)
    {
        newPixel[i] = (int)(cdf[i] * scale);
    }
    // 应用函数实现直方图均衡化
    for (int i = 0; i < dataCount; i++)
    {
        garyscalebit.garyscale[i] = newPixel[garyscalebit.garyscale[i]];
    }
    return 0;
}
#endif